fn main() {
    let mut msg = String::from("Hello");
    let msg3 = &msg; // ok
    println!("{}", msg3); // ok 
    // 可变引用只后不能对原变量和原变量的不可变引用进行操作
    let msg2: &mut String = &mut msg;

    // let msg3 = &msg; // error
    // msg.push_str("string"); // error

    // println!("{}", msg); // error
    unpredictable_mutate(msg2);
    // 如果在可变引用之前对msg进行处理
    // 可能发生不可预计的变化，从而导致可变引用失效
    // 所以编译器会报错
    // println!("{}", msg3); // error
    println!("{}", msg);
}

fn unpredictable_mutate(val: &mut String) {
    val.push_str("_unpredictable");
}
